/* 
typeof: 
  在js中typeof用来获取一个表达式的类型名称, 可以通过打印来查看
  在ts中typeof用来用于获取一个变量或者属性的类型, 用来ts的类型检查
  不能通过打印查看, 如果用打印查看, 就是js的typeof
*/
(() => {

  // typeof在js中使用
  let n:any = 'abc'
  n = () => {}
  n = []
  console.log(typeof n) // 'string'  'function'  'object'
  console.log(typeof console.log()) // 'function' 'undefined'

  // ts中的typeof  

  function fn<T>(v: T): T[] {
    return [v, v]
  }

  /* 得到变量类型 */
  let name = 'atguigu'   // name的类型是 string,  不是'string'
  typeof name  // string 这个类型
  fn<typeof name>('123')
  // fn<typeof name>(234) // error
  type NameType = typeof name
  fn<NameType>('fd')

  /* 得到对象属性的类型 */
  const obj = {
    test:  (s: string): number=>  {
      return s.length
    }
  }

  // 得到对象属性类型后， 并取一个别名 =》 方便后面引用这个类型
  type TestFn = typeof obj.test

  const arr = fn<TestFn>((a: string): number => {
    return a.length + 2
  })
  const r = arr[0]("123")
})()